home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / msds-prl / perl386.zoo / perl.c < prev   
Encoding:
C/C++ Source or Header  |  1993-07-25  |  32.0 KB  |  843 lines

  1. static char *rcsid2 = "$Id: perl.c 1.2 92/08/27 17:37:43 doi Exp $";
  2. char rcsid[] = "RCSfile: perl.c,v Revision: 4.0.1.7 Date: 92/06/08 14:50:39 \nPatch level: ###\n";
  3. /*
  4.  *    Copyright (c) 1991, Larry Wall
  5.  *
  6.  *    You may distribute under the terms of either the GNU General Public
  7.  *    License or the Artistic License, as specified in the README file.
  8.  *
  9.  * Log:    perl.c,v 
  10.  * Revision 4.0.1.7  92/06/08  14:50:39  lwall
  11.  * patch20: PERLLIB now supports multiple directories
  12.  * patch20: running taintperl explicitly now does checks even if $< == $>
  13.  * patch20: -e 'cmd' no longer fails silently if /tmp runs out of space
  14.  * patch20: perl -P now uses location of sed determined by Configure
  15.  * patch20: form feed for formats is now specifiable via $^L
  16.  * patch20: paragraph mode now skips extra newlines automatically
  17.  * patch20: eval "1 #comment" didn't work
  18.  * patch20: couldn't require . files
  19.  * patch20: semantic compilation errors didn't abort execution
  20.  * 
  21.  * Revision 4.0.1.6  91/11/11  16:38:45  lwall
  22.  * patch19: default arg for shift was wrong after first subroutine definition
  23.  * patch19: op/regexp.t failed from missing arg to bcmp()
  24.  * 
  25.  * Revision 4.0.1.5  91/11/05  18:03:32  lwall
  26.  * patch11: random cleanup
  27.  * patch11: $0 was being truncated at times
  28.  * patch11: cppstdin now installed outside of source directory
  29.  * patch11: -P didn't allow use of #elif or #undef
  30.  * patch11: prepared for ctype implementations that don't define isascii()
  31.  * patch11: added eval {}
  32.  * patch11: eval confused by string containing null
  33.  * 
  34.  * Revision 4.0.1.4  91/06/10  01:23:07  lwall
  35.  * patch10: perl -v printed incorrect copyright notice
  36.  * 
  37.  * Revision 4.0.1.3  91/06/07  11:40:18  lwall
  38.  * patch4: changed old $^P to $^X
  39.  * 
  40.  * Revision 4.0.1.2  91/06/07  11:26:16  lwall
  41.  * patch4: new copyright notice
  42.  * patch4: added $^P variable to control calling of perldb routines
  43.  * patch4: added $^F variable to specify maximum system fd, default 2
  44.  * patch4: debugger lost track of lines in eval
  45.  * 
  46.  * Revision 4.0.1.1  91/04/11  17:49:05  lwall
  47.  * patch1: fixed undefined environ problem
  48.  * 
  49.  * Revision 4.0  91/03/20  01:37:44  lwall
  50.  * 4.0 baseline.
  51.  * 
  52.  */
  53.  
  54. /*SUPPRESS 560*/
  55.  
  56. #include "EXTERN.h"
  57. #include "perl.h"
  58. #include "perly.h"
  59. #include "patchlevel.h"
  60.  
  61. char *getenv();
  62.  
  63. #ifdef IAMSUID
  64. #ifndef DOSUID
  65. #define DOSUID
  66. #endif
  67. #endif
  68.  
  69. #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
  70. #ifdef DOSUID
  71. #undef DOSUID
  72. #endif
  73. #endif
  74.  
  75. static char* moreswitches();
  76. static void incpush();
  77. static char* cddir;
  78. static bool minus_c;
  79. static char patchlevel[6];
  80. static char *nrs = "\n";
  81. static int nrschar = '\n';      /* final char of rs, or 0777 if none */
  82. static int nrslen = 1;
  83.  
  84. main(argc,argv,env)
  85. #ifdef DJGPP
  86. int argc;
  87. char **argv;
  88. #else
  89. register int argc;
  90. register char **argv;
  91. #endif /* DJGPP */
  92. register char **env;
  93. {
  94.     register STR *str;
  95.     register char *s;
  96.     char *scriptname;
  97.     char *getenv();
  98.     bool dosearch = FALSE;
  99. #ifdef DOSUID
  100.     char *validarg = "";
  101. #endif
  102.  
  103. #ifdef SETUID_SCRIPTS_ARE_SECURE_NOW
  104. #ifdef IAMSUID
  105. #undef IAMSUID
  106.     fatal("suidperl is no longer needed since the kernel can now execute\n\
  107. setuid perl scripts securely.\n");
  108. #endif
  109. #endif
  110.  
  111. /*
  112.  * this is the args globbing in libglob.a - H.Doi 560*/
  113. namlexp.t fain libglobiMD) -DTar20  01:tsttpe.chaDTab;
  114.  
  115.     return systaRE_NO  /* fr20  01:tifdef IAMsc)
  116. #i :tsttpe.chaDT))MD) -DTa"suincorf(w iidn, "  01:tiffrom mi!endif
  117. Ta"stch1stch* DJGPP */libgl*SUPPRETa"s* pg:tiff= endif /Ta"s* pg:ticf= endcf /Ta"s* pgproblem
  118. = problemf /Ta"s scr= (cor)grl scab;
  119.  
  120.    e scr= (cor)grle scab;
  121.  
  122.    gscr= (cor)grlgscab;
  123.  
  124.    egscr= (cor)grlegscab;
  125.  
  126.    sincorf(el[6];
  127. st,"%3.3s%2.2d",  rdex(= "RC,'4'), PATCHLEVEL);p.t fain libglobiMal c) -DTa"* TGNUeonger nwibuwe execrefNU Gos glmssing Ppts sl cck es glmsfy mave) -DTa"* * pat.  TGN o GNU al*stn nrve* pequrunsfy 
  128.  *vourcSTDAUX eancSTDPRN) -DTa"* pe.cld dpat.) -DTa"*/f DOSUID
  129. #t argcDTa"(push)fcck e(w iauxb;
  130.  
  131.    (push)fcck e(w iprn)f /* DJGPP */!
  132. register
  133. /*
  134.  * /* fr20do_SUIump)MD)     * pgpe.chaDTr= mave  rgv,ev[0])f /    do_SUIumpr= 0f /    loop_pt;   -1;         */nt tiolabow nt nesag,arister    gofy just_$";tf
  135. Ta"stcht fain TAINTf DOSUID
  136. #define  /* fr20 scr== e scr&& gscr== egscf D    l expanywibu== TRUE;         */taintperl explicitly now doesster
  137. /*
  138.  *
  139. /*
  140.  * /* (push)sincorf( rdex(= "RC,'#'), "%dend, PATCHLEVEL);p. /*  evalt;   Str_rig(65,80b;
  141.  
  142.    str_rerl( evalt;,"",0b;
  143.  
  144.    strr= mtr_make("",0b;         */broutistrine im-I flaingster-DTaruoutasE;
  145. ainutasE;
  146. hrig(0b;
  147.  
  148.    ruouthaDTr= mtr_make("c,ar",4b;
  149.  
  150.    stab_xhasE(stabs t("_c,ar",TRUE))M
  151. ainutasE;
  152.  
  153.    ainutasE->tbl_haDTr= "c,ar";
  154.  
  155.     rcstab;
  156. hF v(aF v(stabs t("INC",TRUE)));
  157.  
  158.     rcstab->mtr_pok |  SP_MULTI;
  159.  
  160.    e imgv,en--v)
  161. #++; endc > 0f v,en--v)
  162. #++)MD)     fr20v,ev[0][0] !   -' || !v,ev[0][1]f D     dosereakf DOSUID
  163.     char *vafr20g = "";
  164. f D     = "";
  165. #end PHOOEY ";
  166.  
  167.    gister     = "";
  168. #env,ev[0]f
  169. #endif
  170.     s#env,ev[0]+1;) -DTa"ses();
  171. s:
  172.     s);
  173. s20gs)MD)     c
  174.   '0':)     c
  175.   'a':)     c
  176.   'c':)     c
  177.   'd':)     c
  178.   'D':)     c
  179.   'i':)     c
  180.   'l':)     c
  181.   'n':)     c
  182.   'p':)     c
  183.   'u':)     c
  184.   'U':)     c
  185.   'v':)     c
  186.   'w':)      *vafr20s#enches();
  187. stats)f D        gofy es();
  188. s; D     dosereakf D)     c
  189.   'e':) t fain TAINTf      *vafr20e scr!   scr|| egscr!  gscf D        uidperlNo' noe of e READerl scrsecureldif
  190. #endif
  191.      *vafr20!e_fp)MD)             e_ ouhaDTr= mave  rgTMPPATH)f /        (push)mkdefp(e_ ouhaDT)f /        fr20!*e_ ouhaDT) /        l("suidperlCane imkdefp()")f /        e_fp#enfopen(e_ ouhaDT,"w")f /        fr20!e_fp) /        l("suidperlCan *  open defpora
  192.  *pe.c")f /    Ta"stch     *vafr20v,ev[1]fMD)         fpf s0v,ev[1],e_fp)f /        v,en--v)
  193. #++; /    Ta"stch     *va(push)pf c(   /, e_fp)f /     dosereakf D    c
  194.   'I':) t fain TAINTf      *vafr20e scr!   scr|| egscr!  gscf D        uidperlNo' Ioe of e READerl scrsecureldif
  195. #endif
  196.      *vamtr_ ti(lt;,"-")f /    Ta"smtr_ ti(lt;,s)f /    Ta"smtr_ ti(lt;," ")f /    Ta"sfr20g++s)MD)         (push)a
  197. statstab_l
  198. ay( rcstab),mtr_make(s,0b)f /    Ta"stch     *vagistafr20v,ev[1]fMD)         (push)a
  199. statstab_l
  200. ay( rcstab),mtr_make(v,ev[1],0b)f /        mtr_ ti(lt;,v,ev[1]ff /        v,en--v)
  201. #++; /        mtr_ ti(lt;," ")f /    Ta"s} /     dosereakf D    c
  202.   'P':) t fain TAINTf      *vafr20e scr!   scr|| egscr!  gscf D        uidperlNo' Poe of e READerl scrsecureldif
  203. #endif
  204.      *va forrocess#enTRUE; /    Ta"sm++; /    Ta"sgofy es();
  205. s; D    c
  206.   's':) t fain TAINTf      *vafr20e scr!   scr|| egscr!  gscf D        uidperlNo' soe of e READerl scrsecureldif
  207. #endif
  208.      *va = );
  209. sta#enTRUE; /    Ta"sm++; /    Ta"sgofy es();
  210. s; D    c
  211.   'S':) t fain TAINTf      *vafr20e scr!   scr|| egscr!  gscf D        uidperlNo' Soe of e READerl scrsecureldif
  212. #endif
  213.      *va = FALSE;
  214. TRUE; /    Ta"sm++; /    Ta"sgofy es();
  215. s; D    c
  216.   'x':)      *vackslineigh
  217. TRUE; /    Ta"sm++; /    Ta"sfr20gsf D        statir= mave  rgs)f /     dosereakf D    c
  218.   '-':)      *vav,en--v)
  219. #++; /    Ta"sgofy ();
  220. s_endf D    c
  221.   0: /     dosereakf D    2
  222.  * p: /     dosuidperlUnyriogniz the);
  223. s: -%s",s)f /    }
  224. Ta"stch1s();
  225. s_end:
  226.  
  227.    se;
  228.     c#env,ev[0]f
  229.  *vafr20e_fp)MD)     fr20fflstate_fp)M|| fidn'tte_fp)M|| fcck e(e_fp)) /     dosuidperlCane iwritnsfy defp*pe.cne im-/08%s",amtridn'tterrnob)f /    v,en++,v,ev--f /    se;
  230.     c#ene_ ouhaDTf
  231. Ta"stch DOSUID
  232.    ISHe DOSUID
  233. now supNOWP ';'
  234. registerDOSUID
  235. now supNOWP ':'er
  236. /*
  237.  *
  238. OSUID
  239. TAINT         */Cane ie of #arbitra
  240.  *now suppEADerl scrsecuregster-DTa);
  241. stat;
  242.     "now sup"))f /* DJGPP */TAINT nclude "SUID
  243. PRIVsuperDOSUID
  244. nRIVsup "/usr/ of l/a -/ipts"er
  245. /*
  246.  * /* f;
  247. statnRIVsupb;
  248.  
  249.    (push)a
  250. statstab_l
  251. ay( rcstab),mtr_make(".",1)RE_NO  /* mtr_erl(&str_ro,Nob;
  252.  
  253.    str_erl(&str_yes,YesRE_NO  /*  */open securegster
  254.  *vafr20se;
  255.     c#e= N
  256.  ch)p.t fain libglobiMalD)     fr20()
  257. tty(pe.cho(w ins))M) /     dches();
  258. stat"v")f /    se;
  259.     c#en"-"f
  260. Ta"stchtgister    se;
  261.     c#en"-"f
  262.  
  263. /*
  264.  * /* fr20do FALSE;&& ! rdex(se;
  265.     c, '/');&& 0s#en;
  266.     "nATH")))MD)     c20  0xfoSUI = N
  267.  ch, 0xfom mis= N
  268.  chf /     ret.chf D)     bufeUI = s + mtr.chgs)f /    whe.cn0gs)MD) DOSUID
  269. #deISHe     Ta"sm = cpytill(tokenbuf,s,bufeUI,':',&.ch)
  270. registerOSUID
  271. idprR * /     dosu img
  272.  
  273. ma0f *s;&& *s;!   ,';&& *s;!   ;/* tokenbuf[
  274.  
  275. ++file*m++)f /     dostokenbuf[
  276.  
  277. ]     0'
  278. register     dosu img
  279.  
  280. ma0f *s;&& *s;!   ;/* tokenbuf[
  281.  
  282. ++file*m++)f /     dostokenbuf[
  283.  
  284. ]     0'
  285. reg/*
  286.  *
  287. /*
  288.  *    Ta"sfr20gsf D        m++; /DOSUID
  289. #deISHe     Ta"sfr20
  290.  
  291. && tokenbuf[
  292.  
  293. -1] !   /')
  294. registerOSUID
  295. idprR * /     dosfr20
  296.  
  297. && ((tokenbuf[
  298.  
  299. -1] !   \\');&& 0tokenbuf[
  300.  
  301. -1] !   /')))
  302. register     dosfr20
  303.  
  304. && tokenbuf[
  305.  
  306. -1] !   \\')
  307. reg/*
  308.  *
  309. /*
  310.  *        (push)mtr ti(tokenbuf+
  311.  
  312. ,"/")f /    Ta"s(push)mtr ti(tokenbuf+
  313.  
  314. ,se;
  315.     c);p.t fain DEBUGGINGer     dosfr20 lost & 1f D        uincorf(w iidn,"Lookibglu im%send,tokenbufif
  316. #endif
  317.      *vafr20nt n(tokenbuf,&nt nbufi < 0)         */ *   GNUe?ister        call
  318. ste; /    Ta"sfr20S_ISREG(nt nbuf.st_ ski) /     dos
  319. && ceanu0S_IRUSR,TRUE,&nt nbufi && ceanu0S_IXUSR,TRUE,&nt nbufifMD)         xfoSUI = tokenbuf;               */libgo!ister        ereakf D    Ta"stch     *vafr20!xfom mi))         xfom mis= mave  rgtokenbufif
  320.     }
  321.     fr20!xfoSUI) /     dosuidperlCane in\
  322. set8%s",axfom mis?axfom mis: se;
  323.     c#if
  324.     fr20xfom mi))         Safefree0xfom mi)f /    se;
  325.     c#enmave  rgxfoSUI)f
  326. Ta"stch D dosudpscr= arig(N
  327.  stab);     */b imronsmbetainipopen pscsng cfdgster-DTapscst nus;
  328. hrig(COEFFSIZE); */b imronsmbetainist nus;r 0dead pscsnSUPPRETa"s* pgpe.chaDTr= mave  rgse;
  329.     c);p.
  330.    ruocmd->ctpe.cstab;
  331. nutab(* pgpe.chaDT)f
  332.  *vafr20  rEQ(* pgpe.chaDT,"-"))er    se;
  333.     c#en""f
  334.  *vafr20 forrocess)MD)     c20  0 no#enCPPSTDINf D)     fr20  rEQ( no," now ins")) /     dossincorf(tokenbuf, "%s/%s",aARE_SEDIR, cpp)f /    gister     dossincorf(tokenbuf, "%s", cpp)f /    mtr_ ti(lt;,"-I")f /    mtr_ ti(lt;,nRIVsupb;
  335. t fain libglob    (push)sincorf(buf, "d perd8%s' no\"/^[^#]/b\" d p' no\"/^#[     ]*"patchl[     ]/b\" d p' no\"/^#[     ]*OSUID
  336. [     ]/b\" d p' no\"/^#[     ]*if[     ]/b\" d p' no\"/^#[     ]*ifOSU[     ]/b\" d p' no\"/^#[     ]*ifnOSU[     ]/b\" d p' no\"/^#[     ]*gist/b\" d p' no\"/^#[     ]*giif[     ]/b\" d p' no\"/^#[     ]*unOSU[     ]/b\" d p' no\"/^#[     ]*g/*
  337. /b\" d p' no\"s/^#.*//\" d p'%s'|8%s' C8%s'%s",er     d(ckslineigh?n"-no\"1,/^#/den\""s: ""),
  338. register    (push)sincorf(buf, "d p%s'%s' no'/^[^#]/b' d p' no'/^#[     ]*"patchl[     ]/b' d p' no'/^#[     ]*OSUID
  339. [     ]/b' d p' no'/^#[     ]*"f[     ]/b' d p' no'/^#[     ]*"fOSU[     ]/b' d p' no'/^#[     ]*"fnOSU[     ]/b' d p' no'/^#[     ]*gist/b' d p' no'/^#[     ]*gi"f[     ]/b' d p' no'/^#[     ]*unOSU[     ]/b' d p' no'/^#[     ]*g/*
  340. /b' d p' no's/^[     ]*#.*//' d p'%s'|8%s' C8%s'%s",ert fain LOCNOWDer     dLOCNOWD,
  341. register     d"erd",ertendif
  342.      *(ckslineigh?n"-no'1,/^#/den'"s: ""),
  343. regndif
  344.      *se;
  345.     c, tokenbuf, mtr_;
  346. (lt;), CPPMINUS);p.t fain DEBUGGINGer    fr20 lost & 64)MD)         fpf s0buf,s iidn)f /    Ta"sfpf s0tati,s iidn)f /    }
  347. regndif
  348.     ckslineigh
  349. #ifdef DOSUID
  350.  
  351.     fa                 */eigue oy, the argscaugh inarliNU ster    fr20e scr!   scr&& !e sc)MD     */fr2taintper is no loexp.t fain HASNOWTEfine     Ta"s(push)mrle sca sc);         */musne iutayDerl scrrootsster
  352. isterOSUID
  353. HASNOWTREfine     Ta"s(push)mrlre sca-1,  sc);
  354. register     doserl sc( sc);
  355. reg/*
  356.  *
  357. /*
  358.  *    Ta"sfr20grle scabr!   scf D        uidperlCane ido mrle sc!endif
  359.     tch* DJGPP */
  360.     fa ster    rsfp#enmypopen0buf,"rdif
  361. Ta"stch1svagistafr20!ame;
  362.     c)MD) DOSain TAINTf     fr20e scr!   scr|| egscr!  gscf D     dosuidperlCane itake mrl-scrsecuregsing w ins")f
  363. #endif
  364.     rsfp#enw insf
  365. Ta"stch1svagist
  366.     rsfp#enfopen(se;
  367.     c,"rdif
  368. Ta"sfr20(FILE*)rsfp#e= N
  369.  fp)MD) OSUID
  370.     charDOSUID
  371.  
  372.     fa         */fn c
  373.   securegnger tmroadab.cnbeb ieDerl scrster    fr20e scr&& nt n(stab_ = (ruocmd->ctpe.cstab)->mtr_pt;,&nt nbufi >ma0r&&
  374.      *st nbuf.st_ ski & 0S_IS fa|S_ISGID))MD)         (push)sincorf(buf, "%s/sno l%s", BIN, el[6];
  375. st);f DOSUID
  376. #t argc     *vag\
  377. v(buf, * pg:tif);     */t
  378.  *ag,arister* DJGPP */!
  379. register     dosuidperlCane ido mrl scendif
  380.     tch* DJGP
  381. #endif
  382.     uidperlCane iopen ppts secureg\"%s\":m%send,
  383.      *st b_ = (ruocmd->ctpe.cstab)->mtr_pt;,amtridn'tterrnob)f /Ta"stch1svamtr_free0lt;);         */bree' Ioatiect* pengster-DTastrr= N
  384.  strE_NO  /*  */do we nerd8fy emulateDerl scron secures?nSUPPRETa"s */The acski e ab imthk esBSD sysdefsmthat
  385. hFveDerl scr#! securesoatsab.cd) -DTa"* ari GN kstnow becau esr 0aDerruoity 
  386.  *b.cm.  MNUeoesOSUIDtper    char *va"* arippts willer tmfixmthat
  387.  
  388.  *b.cm, butsfr2you
  389. hFveDatsab.cdDerl scar *va"* securesoari GN kstnow, the awille
  390. ttefpt8fy emulateDerl screanDerlgscar *va"* on securesmthat
  391. hFveDthk esnow-o GNUwise-u eless#bitsDerl.  TheDerl scar *va"* rootsversion must be c
  392. l.cdDeis no lo imsno lN.NNN.  Ir2tegularipptsar *va"* atscoversmthat
  393. it
  394. hFsiopencdDaDerl scrsecure,
  395. it
  396. c
  397. l.sDeis no lo);
  398. har *va"*  GN s  c#:tifmthat
  399. it
  400. hFd.  Ir2eis no loUIDdsmthat
  401.  GN securegnt
  402. hFsar *va"* just opencdDe aNOTDerl scrroot,
  403. it
  404. erls
  405.  GN effectiveD scrbacksfy dhear *va"*  sc.  WeDaone ijust make ppts srl scrrootsbecau esthat
  406. ck es dhear *va"* effectiveD scrwe hFdnbeb ieDinvokibglno l,sfr2it
  407. wasoatffers tgsing dhear *va"*  sc.ar *va"*ar *va"*     ch must be OSUID
  408.  READbo G ppts eanDeis no l, eanD
  409.     fa mustar *va"* be OSUID
  410.  READeis no lo nly.  eis no lomust be srl scrroot.  Thear *va"* ConfigurN securegwilleerl the aupab imyou
  411. fr2you
  412. wanegnt.ar *va"*ar *va"* TGNUeDe aalsy dheipossibility r 0hFveDa securegwhiSE;e ataintpear *va"* srl-scrdunsfy a Ciwrapno .  WeDwanegfy dy dheiTAINT 
  413. stcksar *va"* on dhese mrl-scrsecures, butsaone iwanegfy hFveDthesrverhead ofar *va"*  GNmREADnormal no l, eanDcane iu eseis no lobecau esiegwilleck ear *va"*  GN effectiveD scrinfo,amorwe hFveDan atattionaler n-srl scrrootar *va"* version c
  414. l.cdDt,artno lo imtno lN.NNNsthat
  415. just ckss dheiTAINT 
  416. stcks.ar *va"*/ch DOSUID
  417.     char *vafr20fnt n(pe.cho(rsfp),&nt nbufi < 0)     */ *rmal nt n;e ainerruoeister    uidperlCane int n;secureg\"%s\"",* pgpe.chaDT)f
  418.  *vafr20   nbuf.st_ ski & 0S_IS fa|S_ISGID))MD)      ret.chf D) OSUID
  419.  
  420.     faf DOSUID
  421. HASNOWTREfine      */On the aaccess#
  422. stckgfy make suoeidheiatiect* pengaoeiroadab.c,
  423.      *  GNUeDe aaigue oyDa smallo);anuwmthat
  424.  GN u eracsuldiu esfy make
  425.      * pe.chaDTrpoinegfy an accessib.cnatiect* y.  So  GNUeDe aasuiine
  426.      * c20ncesthat
  427. someoD
  428. csuldin\
  429. set8aDerl scrsecure ckwnREADa
  430.      * r n-accessib.cnatiect* y.  Isaone iknowgwhaegfy dy aboutsthat.
  431.      * ButsIsaone ithenksie's doo importane.  TheDmanue  lpengwhen
  432.      * it
  433. eay aaccessabre ausefulpEADerl scr
  434.  *grams.
  435.      *ter    fr20accessast b_ = (ruocmd->ctpe.cstab)->mtr_pt;,1)R     *doub.cn
  436. stckster     dosuidperlPermission denird");
  437. register     */
  438. frwe cans()ap e screanD sc, then we cansdrlermiD
  439. access# pghts
  440.      * );
  441. h8aDeimp.cnnt n;r 0 GN pe.c, eanDthen compaoeideviceDand
  442.      * inski fy make suoeiwcnatd nt n() on dhe s  c#pe.cnwcnopencd.
  443.      * Then we just hFveDty make suoeihesrimshe cansn\
  444. set8it.
  445.      *ter    D)         mtruc int n; ou   nbuff D)      *vafr20 rlre scae sc, sc)M< 0r|| grl sc(br!  e scr|| grle scabr!   scf D        uidperlCane i()ap  screanDe sc");     */roa oyDpaoanoscrster     *vafr20nt n(stab_ = (ruocmd->ctpe.cstab)->mtr_pt;,& ou   nbufi < 0) D        uidperlPermission denird");     */tcstibglu
  446.   el[hhaDTrGNUeDster     *vafr20 ou   nbuf.st_devr!     nbuf.st_devr|| D         ou   nbuf.st_insr!     nbuf.st_insfMD)         (push)fcck e(rsfp)f /        fr20rsfp#enmypopen0"/lib/mom rroot","w"))MD     */heh, hehister        Ta"sfpncorf(rsfp,
  447. "U era%nDt ped8fy taiideva%nDinsr%nDin place;r 0deva%nDinsr%n!end p(Fe.chaDTrr 0mrl-scrsecuregwaso%s,  scr%nDgscr%n.)endnS"paNUeoe,\nno lend,
  448.              sc, ou   nbuf.st_dev,  ou   nbuf.st_ins,
  449.                nbuf.st_dev,    nbuf.st_ins,
  450.                b_ = (ruocmd->ctpe.cstab)->mtr_pt;,
  451.                nbuf.st_ sc,    nbuf.st_gsc);
  452. r            (push)mypcck e(rsfp)f /        } D        uidperlPermission denirdendif
  453.     Ta"stch     *vafr20 rlre sca sc,e sc)M< 0r|| grl sc(br!   scr|| grle scabr!  e scf D        uidperlCane ies()ap  screanDe sc");ch     *vafr20!ceanu0S_IXUSR,#ifde,&nt nbufif         */cansroa   scrn\
  454. ?ister        uidperlPermission denirdendif
  455.     tch* DJGPP */HASNOWTREfinister* DJGPP */
  456.     fa ster
  457.     fr20!S_ISREG(nt nbuf.st_ ski))er     dosuidperlPermission denird");
  458. r    fr20   nbuf.st_ ski & S_IWOTH)er     dosuidperlSrl sc/gscrsecurege awoitab.cnby world");
  459. r    do );
  460. stah
  461. #ifdef         */-s;e ainerruoeiEADeis ister    ruocmd->ctliD
  462. ++; /    fr20fgrls(tokenbuf,sizer 0 okenbuf, rsfp)#e= N
  463.  SE;|| D      mtrnNE(tokenbuf,"#!",2) )     */roqutiecrnven on Sy aVister     dosuidperlNor#! liD
  464. ")f /    m = tokenbuf+2; /    fr20*s;e= ' ');m++; /    whi.cn(!isSPACE0gsf);m++; /    fr20  rnNE(s-4,"no l",4)r&& ntrnNE(s-9,"no l",4))"s */sanity 
  465. stckgster     dosuidperlNot8aDppts secure")f /    whi.cn(*s;e= ' 'r|| *s;e= '\t');m++; /    /*
  466.      * #! :tiomust be whaegwe s w above.  They/cansinvokesiegby
  467.      * ms tiontper is no loexplicitoy, butsthey/mayDr tmataDany ntrange
  468.      * :tiums ts#beyoanDwhaeg#! say aifsthey/dy invokes is no lothat
  469. way.
  470.      *ter    
  471.  
  472.     r
  473.  
  474. ( = id:ti);
  475. r    fr20  rEQ( = id:ti," PHOOEY ");|| D        mtrnNE(s, = id:ti,
  476.  
  477. );|| !isSPACE0s[
  478.  
  479. ]))er     dosuidperlArgsomust ml[6]r#! liD
  480. ")f /arDOSUID
  481.  
  482.     faer    fr20e scr!   scr&& 0   nbuf.st_ ski & S_I  fa)r&&
  483.      *  e scr=     nbuf.st_uscf D     dosfr20!do_unOumpf D        uidperlYOU/HAVEN'T DISABLED OWT-fa ARE_SES IN THE KERNEL YET!end pFIX YOUR KERNEL, PUT A CiWRAPPER AROUND THIS ARE_SE, OR USE -u AND UNDUMP!endif
  484. * DJGPP */
  485.     fa ster
  486.     fr20e sc)MD     */oops, we'reDr tmthe srl scrroot no loexp.        (push)fcck e(rsfp)f /DOSUID
  487.  
  488.     faer        (push)sincorf(buf, "%s/sno l%s", BIN, el[6];
  489. st);f DOSUID
  490. #t argc     *vag\
  491. v(buf, * pg:tif);     */t
  492.  *ag,arister* DJGPP */!
  493. register
  494. /*
  495.  *    Ta"suidperlCane ido mrl scendif
  496.     tch
  497. r    fr20   nbuf.st_ ski & S_ISGIDr&& nt nbuf.st_gscr!  egsc)MDp.t fain HASNOWTEGine     Ta"s(push)mrlegsc(   nbuf.st_gsc);
  498. r
  499. isterOSUID
  500. HASNOWTREGine     Ta"s(push)mrlregsc((GinTYPE)-1,   nbuf.st_gsc);
  501. r
  502. ister     doserlgsc(   nbuf.st_gsc);
  503. r
  504. /*
  505.  *
  506. /*
  507.  *    Ta"sfr20grlegscabr!     nbuf.st_gsc) D        uidperlCane ido mrlegsc!endif
  508.     tch    fr20   nbuf.st_ ski & S_IS fa)r{er     *vafr20nt nbuf.st_uscr!  e scf Dt fain HASNOWTEfine         (push)mrle sca   nbuf.st_uscf;     */allothat
  509. b imthissster
  510. isterOSUID
  511. HASNOWTREfine         (push)mrlre sca(UinTYPE)-1,   nbuf.st_ sc);
  512. register        erl sc(   nbuf.st_ sc);
  513. reg/*
  514.  *
  515. /*
  516.  *    Ta"sfr20grle scabr!     nbuf.st_uscf D        uidperlCane ido mrle sc!endif
  517.     tch    gistafr20 sc)MD             */oops, mustne ieaiiasorootsster
  518.  fain HASNOWTEfine     Ta"s(push)mrle sca(UinTYPE)usc);
  519. r
  520. isterOSUID
  521. HASNOWTREfine     Ta"s(push)mrlre sca(UinTYPE)-1,(UinTYPE)usc);
  522. r
  523. ister     doserl sc((UinTYPE)usc);
  524. r
  525. /*
  526.  *
  527. /*
  528.  *    Ta"sfr20grle scabr!   scf D        uidperlCane ido mrle sc!endif
  529.     tch     scr= (cor)grl sc(bf
  530.     e scr= (cor)grle sc(bf
  531.     gscr= (cor)grlgsc(bf
  532.     egscr= (cor)grlegsc(bf
  533.     fr20!ceanu0S_IXUSR,TRUe,&nt nbufifer     dosuidperlPermission denirdendif     */they/cane ido thisssterTa"stchOSUID
  534.  
  535.     faf 1svagistafr20pre
  536.  *cess)er    uidperl-PDr tmallowecrb imerl sc/erlgsc secureendif
  537. 1svagist
  538.     uidperlSecuregnger tmerl sc/erlgsc EADeis no lendif
  539. * isterOSUnain TAINT         */wc#:tene itaartno lo im is no loexp.Ta"s */secureghFsiaiwrapno --cane ieaiieis no lo imwc#ck e e screxp.Ta"sgistafr20e scr!   scr|| egscr!  gscfr{er    (push)fcck e(rsfp)f /    (push)sincorf(buf, "%s/tno l%s", BIN, el[6];
  540. st);f DOSUID
  541. #t argc    g\
  542. v(buf, * pg:tif);     */t
  543.  *ag,arister* DJGPP */!
  544. register    uidperlCane ieunDerl scrsecure );
  545. h8taart 
  546. stcksdif
  547. Ta"stch* DJGPP */TAINT ster* DJGPP */
  548.     fa ster* istP */!
  549. O  fa ster*SUnain TAINT         */wc#:tene itaartno lo im is no loexp.Ta"sfr20e scr!   scr|| egscr!  gscfr{     */( is no lockssne iexist,
  550. insuict) ster*SUnain OWT fa_ARE_SES_ARENOWCURENNOWer    unt n(pe.cho(rsfp),&nt nbufif     */mayDbe ei GNUiwrapnodo imroa  s scrster    fr200e scr!   scr&& e scr=     nbuf.st_uscr&& nt nbuf.st_ ski & S_IS fa)er     dos|| D        (egscr!  gscr&& egscr=     nbuf.st_gscr&& nt nbuf.st_ ski & S_ISGfa)er     dof D     dosfr20!do_unOumpf D        uidperlYOU/HAVEN'T DISABLED OWT-fa ARE_SES IN THE KERNEL YET!end pFIX YOUR KERNEL, PUT A CiWRAPPER AROUND THIS ARE_SE, OR USE -u AND UNDUMP!endif
  551. * DJGPP */OWT fa_ARE_SES_ARENOWCURENNOWrster     */ *t0mrl-sc,omust be wrapnodoster    (push)fcck e(rsfp)f /    (push)sincorf(buf, "%s/tno l%s", BIN, el[6];
  552. st);f DOSUID
  553. #t argc    g\
  554. v(buf, * pg:tif);     */t
  555.  *ag,arister* DJGPP */!
  556. register    uidperlCane ieunDerl scrsecure );
  557. h8taart 
  558. stcksdif
  559. Ta"stch* DJGPP */TAINT ster* DJGPP */
  560. O  fa sterf DOS !OSUID
  561.  (
  562.     fa)r&& !OSUID
  563.  (TAINT)PPRETa"s */skipab iwarc EADinputsfy dhemroa  secure?nSUPPRETa"swhi.cn(cksxtract) {er    fr200s
  564.     r_grls(liD
  565.   r, rsfp, 0))#e= N
  566.  SE)er     dosuidperlNorPpts secureab unO EADinputendif
  567.     fr20*s;e= '#'r&& n[1];e= '!'r&& inetr(s,"no l"))r{er     *vaungetc('\n',rsfp)f         */fy keep liD
  568. csurt  pghtoexp.        cksxtracth
  569. #ifdefer     *vafr20nh
  570. inetr(s,"no l -"))r{er        m += 6f /        /*SUPPRESS 530ster        whi.cn(nh
  571. moes();
  572. sta(sf);f
  573.     Ta"stch     *vafr20ctatrr&& chatr0ctatri < 0) D        uidperlCane ichatr/fy %s",ctatrif
  574.     tchTa"stch* DJGPP */!OSUID
  575.  (
  576.     fa)r&& !OSUID
  577.  (TAINT)nSUPPRETa"sOSUstab
  578.     abs t("_",TRUe)f /ar doseubhaDTr    r_make("momn",4)f
  579.  *vafr20no ldb)r{er    deb  ashr  hnew(0)f /    m  b_xhFsh(  abs t("_DB",TRUe))#e deb  ash;er    ruo  ashr  deb  ash;er    dbargso    ab_xarray(aata(0 ou   b
  580.     abs t("args",TRUe))))f /     ou   b->mtr_pok |= SP_MULTI;er    dbargs->ary_flagso  0;er    DB   b
  581.     abs t("DB",TRUe);er    DB   b->mtr_pok |= SP_MULTI;er    DBliD
  582.     abs t("dbliD
  583. ",TRUe);er    DBliD
  584. ->mtr_pok |= SP_MULTI;er    DBeubr  hata( ou   b
  585.     abs t("eub",TRUe))f /     ou   b->mtr_pok |= SP_MULTI;er    DBetpel
  586.     ab_ = (( ou   b
  587.     abs t("etpel
  588. ",TRUe)))f /     ou   b->mtr_pok |= SP_MULTI;er    DBtrac
  589.     ab_ = (( ou   b
  590.     abs t("trac
  591. ",TRUe)))f /     ou   b->mtr_pok |= SP_MULTI;er    DBsignale    ab_ = (( ou   b
  592.     abs t("etgnal",TRUe)))f /     ou   b->mtr_pok |= SP_MULTI;er    ruo  ashr  def  ash;erTa"stchRETa"s */init tokenNUiSUPPRETa"sbuf DJr  bufpt;
  593.     r_grl(liD
  594.   r)f /ar doseFve  ackg=Danew(N
  595.  stab)f         */b imeavtperr n-loc
  596. l  = uesssterTa"s  ackg=Danew(N
  597.  stab)f         */b imeavtperr n-loc
  598. l  = uesssterTa"s  ack->ary_flagso  0;         */ *t0amroa  arrayssterTa"sape.l(  ack,63);sape.l(  ack,-1if     */presxt DJr  ackgsterTa"sape.l( Fve  ack,63);sape.l( Fve  ack,-1ifchRETa"s */nowgpaoseidheisecureaSUPPRETa"serror_csurt   0;er *vafr20yypaose();|| error_csurt) {er    fr20miDus_c)er     dosuidperl%s hat compilation errors.end, * pgpe.chaDTbf
  599.     eistP{er     dosuidperlE\
  600. seion r 0%s abortododueDty compilation errors.end,er        * pgpe.chaDTbf
  601.     }erTa"stchRETa"sNew(50,loop_  ack,128,mtruc iloop);f DOSID
  602. #EBUGGINGer *vafr20debug) {er    New(51,debhaDT,128,c20rif
  603.     New(52,debdelim,128,c20rif
  604. Ta"stch* DJGPer *varuo  ashr  def  ash;erer *vapre
  605.  *cessh
  606. #ifdeferTa"sfr20e_fp)#{er    e_fp = N
  607.  fpf /    (push)UNLINK0e_ ouhaDTbf
  608. Ta"stchRETa"s */initi= izernverythiperthat
  609. wone ichangeafr2wc#unOumpaSUPPRETa"sfr20nig   b
  610.     abs t("SIG",a
  611.  stabs))r{er    nig   b->mtr_pok |= SP_MULTI;er    (push)hata(nig   bbf
  612. Ta"stchRETa"smagic= ize("!#?^~=-%.+&*()<>,\\/[|`':\004\t\020\024\027\006dif
  613. Ta"su erinit()f         */EADcastPliDkodoCoroseiD
  614.  
  615. wantsmagic=   =riab.csaSUPPRETa"samno    b
  616.     abs t("&",a
  617.  stabs)f
  618. Ta"sleft   b
  619.     abs t("`",a
  620.  stabs)f
  621. Ta"s pght   b
  622.     abs t("'",a
  623.  stabs)f
  624. Ta"ss wamno  aDJr  (amno    b
  625. || left   b
  626. ||  pght   b)f
  627.  *vafr20 ou   b
  628.     abs t(":",a
  629.  stabs)) /    m r_mrl(stab_ = ( ou   b),c2opset)f
  630.  *vafr20 ou   b
  631.     abs t("\024",a
  632.  stabs)) /    time(&basttimeifchRETa"s */dhesc#:tene inecess=rilysmagic=  exp.Ta"sfr20 ou   b
  633.     abs t("\014",a
  634.  stabs))r{er    n r_mrl(stab_ = ( ou   b),"\fdif
  635.     b imfeede    ab_ = ( ou   b)f
  636. Ta"stchTa"sfr20 ou   b
  637.     abs t(";",a
  638.  stabs)) /    m r_mrl(STAB_STR( ou   b),"\034")f
  639.  *vafr20 ou   b
  640.     abs t("]",a
  641.  stabs))r{er    n re  STAB_STR( ou   b);er    n r_mrl(str,rcssc);
  642. r    str->mtr_u.mtr_nvale  atof(el[6];
  643. st);f     str->mtr_nokg=D1f
  644. Ta"stchTa"smtr_nmrl(stab_ = (  abs t("\"d, TRUe)), " d, 1ifchRETa"sstdinet b
  645.     abs t("STDIN",TRUe);erTa"sstdinet b->mtr_pok |= SP_MULTI;er dosfr20!stab_io(stdinet b)) /    m ab_io(stdinet b)
  646.     io_new();erTa"sstab_io(stdinet b)->ifp = stdin;er dos ou   b
  647.     abs t("etdin",TRUe);erTa"sstab_io( ou   b)e    ab_io(stdinet b);er dos ou   b->mtr_pok |= SP_MULTI;erer dos ou   b
  648.     abs t("STDOUT",TRUe);erTa"s ou   b->mtr_pok |= SP_MULTI;er dosfr20!stab_io( ou   b)) /    m ab_io( ou   b)e    io_new();erTa"sstab_io( ou   b)->ofp = stab_io( ou   b)->ifp = stdose;RETa"sOSUose   b
  649.    ou   b;er dos ou   b
  650.     abs t("etdose",TRUe);erTa"sstab_io( ou   b)e    ab_io(OSUose   b);er dos ou   b->mtr_pok |= SP_MULTI;erer dosruoose   b
  651.     abs t("STDERR",TRUe);erTa"sruoose   b->mtr_pok |= SP_MULTI;er dosfr20!stab_io(ruoose   b)) /    m ab_io(ruoose   b)e    io_new();erTa"sstab_io(ruoose   b)->ofp = stab_io(ruoose   b)->ifp = stderr;er dos ou   b
  652.     abs t("etderr",TRUe);erTa"sstab_io( ou   b)e    ab_io(ruoose   b);erTa"s ou   b->mtr_pok |= SP_MULTI;er dosruoose   b
  653.   OSUose   bf         */();
  654. s backgty STDOUTaSUPPRETa"s   nhaDTr  Str_new(66,0)f         */last pe.chaDT2wc#diJr  at onaSUPPRETa"s */nowgthat
  655. securegngepaosed, we/cans skifymrocorc sepaoatoUiSUPPRETa"srsh
  656. nrsf
  657. Ta"s s
  658.  
  659.   n s
  660.  
  661. f
  662. Ta"s sc20r
  663.   n sc20rf
  664. Ta"s spaoar  (n s
  665.  
  666.  = 2);erTa"sstr_nmrl(stab_ = (  abs t("/d, TRUe)), rs,s s
  667.  
  668. ifchRETa"sfr20do_unOumpf D    my_ung\
  669. (ifchRETajust_doit:         */come GNUeafr2eunniperansunOumpedea.osegsterTa"sargc--,:tif++f     */skipahaDT2r 0secureaSUPPTa"sfr20do();
  670. sta)r{er    b im(;sargc > 0r&& **:tif;e= '-';sargc--,:tif++)r{er     *vafr20:tif[0][1];e= '-')r{er        argc--,:tif++fer        broakf
  671.     Ta"stch     *vafr20nh
  672. index0:tif[0], '='))r{er        *s++h
  673. '\0'fer        n r_mrl(stab_ = (  abs t(:tif[0]+1,TRUe)),s)f
  674.     Ta"stch     *vagister        etr_nummrl(stab_ = (  abs t(:tif[0]+1,TRUe)),0doub.c)1.0if
  675.     tchTa"stch*OSID
  676. TAINTerTa"s aartede  1;ch* DJGPer *vafr20 ou   b
  677.     abs t("0",a
  678.  stabs))r{er    n r_mrl(stab_ = ( ou   b),* pgpe.chaDTbf
  679.     magichaDT("0", N
  680.  SE, 0)f
  681. Ta"stchTa"sfr20 ou   b
  682.     abs t("\030",a
  683.  stabs)) /    m r_mrl(stab_ = ( ou   b),* pg:tif[0])f
  684.  *vafr20:tif   b
  685.     abs t("ARGV",a
  686.  stabs))r{er    :tif   b->mtr_pok |= SP_MULTI;er    (push)aata(:tif   bbf
  687.     aclear(stab_array(atif   bbif
  688.     b im(;sargc > 0;sargc--,:tif++)r{er     *va(push)apush(  ab_array(atif   bb,  r_make(:tif[0],0)if
  689.     tchTa"stch*OSID
  690. TAINTerTa"s(push)   abs t("ENV",TRUe);         */must te   PATH aDJrIFS ster* DJGPerTa"sfr20enf   b
  691.     abs t("ENV",a
  692.  stabs))r{er    enf   b->mtr_pok |= SP_MULTI;er    (push)hata(enf   bif
  693.     hclear(stab_hFsh(enf   bi,
  694. #ifdeif
  695.     fr20enfr!  enfiron)er     dosenfiron[0] = N
  696.  SEf
  697.     b im(;s*enf;senf++)r{er     *vafr20!0nh
  698. index0*enf,'='))) D        coneiDuef
  699.     Ta"s*s++h
  700. '\0'fer    Ta"sstrr    r_make(s--,0)fer    Ta"sstr_magic(str, enf   b, 'E',s*enf, s -s*enf)fer    Ta"s(push)hstoUe(stab_hFsh(enf   bi,
  701. *enf, s -s*enf, str, 0)fer    Ta"s*s;e '='f
  702.     tchTa"stch*OSID
  703. TAINTerTa"s aartede  0;ch* DJGPer *vafr20 ou   b
  704.     abs t("$",a
  705.  stabs)) /    m r_nummrl(STAB_STR( ou   b),0doub.c)grlpsc(bifchRETa"sfr20dowarn)r{er    n ab_
  706. stck('A','Z')f /    m  b_
  707. stck('a','z'bf
  708. Ta"stchRETa"sfr20netjmp(top_enf))     */srls goto_t:ti onalongjumpaSUPP    loop_pt;
  709.   -1f         */(t:t ilabslr  ackgag,aristerf DOSID
  710. #EBUGGINGer *vafr20debug & 1024) D    Oump_a
  711.  ()f
  712.  *vafr20debug)
  713.     bincorf(etderr,"\nEXWCUTING...enendif
  714. * DJGPchRETa"sfr20miDus_c)r{er    bincorf(etderr,"%s syntax OKend, * pgpe.chaDTbf
  715.     exit(0bf
  716. Ta"stchRETa"s */do ieaSUPPRETa"s(push) cmd_g\
  717. (momn_root,G_ARALAR,-1ifchRETa"sfr20goto_t:ti)er    uidperlCane iUIDdilabslr\"%s\"--abortipe",goto_t:ti)f
  718.  *vaexit(0bf
  719. Ta"s */NOTREACHEa stertchREpush
  720. magic= ize(list)erregsstNUic20r
  721. *listf
  722. {er dosr20r
  723. sym[2]fchRETa"ssym[1];e
  724. '\0'ferTa"swhi.cn(*sym;e
  725. *list++)
  726.     magichaDT(sym, N
  727.  SE, 0)f
  728. tchREpush
  729. magichaDT(sym,haDT,haD
  730.  
  731. i
  732. c20r
  733. *sym;
  734. c20r
  735. *haDT;
  736. art haD
  737.  
  738. f
  739. {er dosregsstNUiSTAB
  740. *s  b;erRETa"sfr20n  b
  741.     abs t(sym,a
  742.  stabs))r{er    n  b_flags(   b)e  SF_VMAGIC;er    n r_magic(stab_ = (  ab),    b, 0,ahaDT, haD
  743.  
  744. bf
  745. Ta"stchtchRE  atic push
  746. incpush(pi
  747. c20r
  748. *pf
  749. {er dosr20r
  750. *s;erRETa"sfr20!pf D    rrl rnfchRETa"s */Broak at a
  751.   sepaoatoUsssterTa"swhi.cn(*p)#{er     */Fi   ,/skipaany/conmr
  752. seive sepaoatoUssster    whi.cn(
  753. *p;e= PERLLIB_SEP )r{er     *va */Uncomms tidheing\t liD
  754. b imPATH semanticsoexp.         */(push)apush(  ab_array(inc  ab),   r_make(".d, 1i);sexp.        p++fer    }
  755.     fr2020nh
  756. index0p, PERLLIB_SEP))r!= N
  757.  SE )r{er     *va(push)apush(  ab_array(inc  ab),   r_make(p, (int)(s -sp)))f /        p
  758.     + 1;ch    } eistP{er     dos(push)apush(  ab_array(inc  ab),   r_make(p, 0))f /        broakf
  759.     }
  760. Ta"stchtchREpush
  761.  FveliD
  762.  (array,   rf DARRAY *arrayf
  763. STR
  764. *s rf
  765. {er dosregsstNUir20r
  766. *sr    r->mtr_ptrf
  767. Ta"s egsstNUir20r
  768. *s DJr    r->mtr_ptr +   r->mtr_ruof
  769. Ta"s egsstNUir20r
  770. *tf
  771. Ta"s egsstNUiart liD
  772.   1;PPRETa"swhi.cn(sr&& n < s DJ)r{er    STR
  773. * ou  rr  Str_new(85,0)fer /    th
  774. index0s,s'\n'if
  775.     fr20t)er     dost++fer    gister     dostr    DJfer /    str_nmrl( ou  r,  ,str- s)f
  776.     astoUe(array, liD
  777. ++,s ou  rif
  778.     sr  tf
  779. Ta"stchtchRE */dhngeroseiD
  780. gngearino l.c by firtuT2r 0beipersort2r 0ansaltNUnate momn()nSUPPREart
  781. do_e = (  r,optype,  ash, Fvecmd,gimms,:tilast)
  782. STR
  783. *s rf
  784. art optypef
  785. HASH
  786. *s  sh;erart  Fvecmd;erart gimms;erart *:tilastf
  787. {er dosSTR
  788. **s 
  789.     ack->ary_arrayf
  790. Ta"sfrt rrl = f
  791. Ta"sCMa smyroot = N
  792.  Smd;erTa"sARRAY *arf
  793. Ta"sfrt if
  794. Ta"sCMa s VOLATILE oldruoSmd = ruoSmdf
  795. Ta"sVOLATILE art old ou _bast
  796.    ou _bastf
  797. Ta"sVOLATILE art old Fve
  798.    Fve  ack->ary_fe.lf
  799. Ta"sVOLATILE art oldno ldb
  800.   no ldbf
  801. Ta"sSPAT s VOLATILE oldspat = ruospatf
  802. Ta"sSPAT s VOLATILE oldlspat = lastspatf
  803. Ta"s  atic c20r
  804. *last_e =  = N
  805.  SEf
  806. Ta"s  atic long last_e
  807.  
  808.   0f
  809. Ta"s  atic CMa slast_root = N
  810.  Smd;erTa"sVOLATILE art sp
  811.   :tilast[0];er dosr20r
  812. *specpe.chaDT;er dosr20r
  813. * oupe.chaDT;er dosart paosiper  1;PPRETa"s ou _bast
  814.    ou _maxf
  815.  *vafr20ruo  ashr!    ash)r{er    (push) Fvehptr(&ruo  ash);er    ruo  ashr    ash;erTa"stchTa"sstr_mrl(stab_ = (  abs t("@",TRUe)),"")f
  816.  *vafr20ruoSmd->c_liD
  817.    0)         */done idebug debugger...sexp.    no ldb
  818.   #ifdeferTa"sruoSmd = &compilipef
  819.  *vafr20optype
  820.    O_EVAL)r{         */ *rm=  e =  exp.    ruoSmd->c_pe.cn  b
  821.   f  ab("(e = )");er    ruoSmd->c_liD
  822.   1;ch    str_msrl(liD
  823.   r,  rif
  824.     str_ral(liD
  825.   r,";\n;endif     */be kIDdity dhem exp.    fr20no ldb)er     dos FveliD
  826.  (  ab_xarray(ruoSmd->c_pe.cn  b), liD
  827.   rif
  828. Ta"stchTa"seistP{er    fr20last_root && !mn_e = )P{er     dosSafefres(last_e = )f /        last_e =  = N
  829.  SEf
  830.         cmd_fres(last_root)f /        last_root = N
  831.  Smd;er    }
  832.     specpe.chaDTr    r_grl(str);er    n r_mrl(liD
  833.   r,""if
  834.     fr20optype
  835.    O_REQUIRE && &mtr_unID
  836. != /      hfe
  837. s(stab_hFsh(inc  ab),  pecpe.chaDT,   r.ch( pecpe.chaDT), 0))P{er     dosruoSmd = oldruoSmdf /         ou _bast
  838.   old ou _bastfer    Ta"sst[++sp];e
  839. &mtr_yesf /        po ldb
  840.   oldno ldbf /        rrl rn  p;er    }
  841.      oupe.chaDT
  842.    Fve  r( pecpe.chaDT)f
  843.     fr20* oupe.chaDT
  844.  e
  845. '/'
  846. ||er     *va(* oupe.chaDT
  847.  e
  848. '.' &&  D        ( oupe.chaDT[1];e= '/'
  849. ||er         ( oupe.chaDT[1];e= '.' &&  oupe.chaDT[2];e= '/')))) D    {er     dosrsfp = fopch( oupe.chaDT,"r"if
  850.     tch    eistP{er     dosare    ab_array(inc  ab)f /        b im(i
  851.   0f i <  :t->ary_fe.lf i++)r{er        (push) incorf(buf, "%s/%s",er            r_grl(afe
  852. s(ar,i,TRUe)),  pecpe.chaDT)f
  853.         rsfp = fopch(buf,"r"if
  854.         fr20rsfp)r{er         dosr20r
  855. *s
  856.   buffer /         *vafr20*s
  857.  = '.' && s[1];e= '/') D            sr+= 2; /         *vaSafefres( oupe.chaDT); /         *va oupe.chaDT
  858.    Fve  r( ); /         *vabroakf
  859.         }
  860.     Ta"stch    }p.    ruoSmd->c_pe.cn  b
  861.   f  ab( oupe.chaDT); /    Safefres( oupe.chaDT); /     oupe.chaDT
  862.   N
  863.  SEf
  864.     fr20!rsfp)r{er     dosruoSmd = oldruoSmdf /         ou _bast
  865.   old ou _bastfer    Ta"sfr20optype
  866.    O_REQUIRE)r{er         incorf(tokenbuf,"Cane ilocate %geari@INC",  pecpe.chaDT)f
  867.         fr20inetr(tokenbuf,".h ")) D        Ta"sstrral(tokenbuf,"20rhange .h ty .ph moybe?)")f
  868.         fr20inetr(tokenbuf,".ph ")) D        Ta"sstrral(tokenbuf,"20diJryou2eun h2ph?)")f
  869.         uidperl%s",tokenbuf)f
  870.     Ta"stch     *vafr20gimmsr!  G_ARRAY)er        et[++sp];e
  871. &mtr_unID
  872. f /        po ldb
  873.   oldno ldbf /        rrl rn  p;er    }
  874.     ruoSmd->c_liD
  875.   0f
  876. Ta"stchTa"sfn_e = ++fer *vaoldoldbufpt;
  877.   oldbufpt;
  878.   bufpt;
  879.     r_grl(liD
  880.   rif
  881. Ta"sbuf DJr  bufpt;
  882. + liD
  883.   r->mtr_ruof
  884. Ta"sfr20++loop_pt;
  885. >= loop_max)r{er    loop_maxr+= 128f /    Renew(loop_  ack, loop_max,   ruct loopif
  886. Ta"stchTa"sloop_  ack[loop_pt;].loop_labslr= "_EVAL_";chTa"sloop_  ack[loop_pt;].loop_sp
  887.    p;erDOSID
  888. #EBUGGINGer *vafr20debug & 4)r{er    deb("(Pushing labslr#%d _EVAL_)end, loop_pt;if
  889. Ta"stch* DJGPer *vae = _root = N
  890.  Smd;erTa"sfr20netjmp(loop_  ack[loop_pt;].loop_enf))r{er    rrl = 
  891.   1;chTa"stchTa"seistP{er    error_rount
  892.   0f
  893.     fr20rsfp)r{er        rrl = 
  894.   yypaose();er        rrl = 
  895. |= error_rountf
  896.     tch    eistPfr20last_root && last_e
  897.  
  898.  =sbuf DJr- bufpt;er      && *bufpt;
  899.  =
  900. *last_e =  && !bcmp(bufpt;,last_e = ,last_e
  901.  
  902. )){er        rrl = 
  903.   0;er        e = _root = last_root;     */ * pofrt in rrpaosiperexp.    tch    eistPfr20fn_e = 
  904.  =
  905. 1 && ! Fvecmd)r{er     *vafr20last_root)r{er        Safefres(last_e = )f /        last_e =  = N
  906.  SEf
  907.         cmd_fres(last_root)f /        } /        last_root = N
  908.  Smd;er        last_e
  909.  
  910.   buf DJr- bufpt;f /        last_e =  = n Fve  r(bufpt;, last_e
  911.  
  912. );er        rrl = 
  913.   yypaose();er        rrl = 
  914. |= error_rountf
  915.     Ta"sfr20!rrl = ) /        last_root = e = _rootf
  916.     Ta"sfr20!last_root)r{er        Safefres(last_e = )f /        last_e =  = N
  917.  SEf
  918.     Ta"stch    }p.    gister     dosrrl = 
  919.   yypaose();erTa"stchTa"smyroot = e = _rootf         */in cast
  920. cmd_g\
  921. /does0anodher e = !aSUPPRETa"sfr20rrl = 
  922. || error_rount)r{er    n 
  923.     ack->ary_arrayf
  924.     sp
  925.   :tilast[0];er    fr20gimmsr!  G_ARRAY)er    Ta"sst[++sp];e
  926. &mtr_unID
  927. f /    fr20naosip